﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace LightEngine
{
    namespace Utilities
    {
        namespace Types
        {
            /// <описание класса [AttributeUsage(AttributeTargets.Field)] public class StringValueAttribute : Attribute>
            /// Версия класса 1.0
            /// Автор(ы): Ушаков Михаил
            /// Класс предназначен для задания строковы хатрибутов полям объектов (классов, 
            /// перчислений, структур).
            /// 1. Константы класса:
            ///    отсутствуют.
            /// 2. Поля класса:
            /// а) private String AttributeValue; строка, представляющая строковый атрибут.
            /// 3. Методы класса:
            /// а) public StringValueAttribute(String Value) конструкторкласса, производит 
            ///    инициализацию строкового атрибута AttributeValue значением Value.
            /// 4. Свойства и индексаторы класса:
            /// а) public String Value открытое свойство только для чтение, предназначенное для
            ///    получения строки атрибута.
            /// </описание класса [AttributeUsage(AttributeTargets.Field)] public class StringValueAttribute : Attribute>

            [AttributeUsage(AttributeTargets.Field)]
            public class StringValueAttribute : Attribute
            {
                private String AttributeValue;

                public StringValueAttribute(String Value) { AttributeValue = Value; }

                public String Value
                {
                    get { return AttributeValue; }
                }

            }

            /// <описание класса public class EnumString>
            /// Версия класса 1.0
            /// Автор(ы): Ушаков Михаил
            /// Класс предназначен для получения строкового атрибута константы из перечисления. 
            /// перчислений, структур).
            /// 1. Константы класса:
            ///    отсутствуют.
            /// 2. Поля класса:
            ///    отсутствуют.
            /// 3. Методы класса:
            /// а) public static String GetEnumString(Enum StringEnumType) попытка получить
            ///    строковый атрибут константы StringEnumType, если получение проходит без
            ///    генерации исключительной ситуации возвращается строковый атрибут, иначе
            ///    String.Empty.
            /// 4. Свойства и индексаторы класса:
            ///    отсутсвуют
            /// </описание класса public class EnumString>
            public class EnumString
            {
                public static String GetEnumString(Enum StringEnumType)
                {
                    String Result = String.Empty;
                    try
                    {
                        Type EnumType = StringEnumType.GetType();
                        FieldInfo Field = EnumType.GetField(StringEnumType.ToString());
                        StringValueAttribute Attr = (StringValueAttribute)Attribute.GetCustomAttribute(Field,
                                                                                                       typeof(StringValueAttribute));
                        Result = Attr.Value;
                    }
                    catch (Exception Exc)
                    {
                        Exc.ToString();
                    }
                    return Result;
                }
            }
        }
    }
}